From: kaf24@firebug.cl.cam.ac.uk Date: Tue, 16 May 2006 08:08:06 +0000 (+0100) Subject: [XENOPROFILE] Fix incorrect use of on_each_cpu() which could lead X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~16047^2~68 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success//%22http:/www.example.com/cgi/success/?a=commitdiff_plain;h=28978ff92ad4e47c0a2a96680243422ab749cfb8;p=xen.git [XENOPROFILE] Fix incorrect use of on_each_cpu() which could lead to sleep with interrupts disabled. on_each_cpu() disables interrupts. proc_create() calls passes GFP_KERNEL to kmalloc(). The patch converts from on_each_cpu() to for_each_cpu(), and then simplifies things. Signed-off-by: Markus Armbruster --- diff --git a/linux-2.6-xen-sparse/arch/i386/oprofile/xenoprof.c b/linux-2.6-xen-sparse/arch/i386/oprofile/xenoprof.c index bcfdc23e74..5365ed6fcc 100644 --- a/linux-2.6-xen-sparse/arch/i386/oprofile/xenoprof.c +++ b/linux-2.6-xen-sparse/arch/i386/oprofile/xenoprof.c @@ -141,56 +141,40 @@ xenoprof_ovf_interrupt(int irq, void * dev_id, struct pt_regs * regs) } -static void unbind_virq_cpu(void * info) -{ - int cpu = smp_processor_id(); - if (ovf_irq[cpu] >= 0) { - unbind_from_irqhandler(ovf_irq[cpu], NULL); - ovf_irq[cpu] = -1; - } -} - - static void unbind_virq(void) { - on_each_cpu(unbind_virq_cpu, NULL, 0, 1); -} - - -int bind_virq_error; + int i; -static void bind_virq_cpu(void * info) -{ - int result; - int cpu = smp_processor_id(); - - result = bind_virq_to_irqhandler(VIRQ_XENOPROF, - cpu, - xenoprof_ovf_interrupt, - SA_INTERRUPT, - "xenoprof", - NULL); - - if (result<0) { - bind_virq_error = result; - printk("xenoprof.c: binding VIRQ_XENOPROF to IRQ failed on CPU " - "%d\n", cpu); - } else { - ovf_irq[cpu] = result; + for_each_cpu(i) { + if (ovf_irq[i] >= 0) { + unbind_from_irqhandler(ovf_irq[i], NULL); + ovf_irq[i] = -1; + } } } static int bind_virq(void) { - bind_virq_error = 0; - on_each_cpu(bind_virq_cpu, NULL, 0, 1); - if (bind_virq_error) { - unbind_virq(); - return bind_virq_error; - } else { - return 0; + int i, result; + + for_each_cpu(i) { + result = bind_virq_to_irqhandler(VIRQ_XENOPROF, + i, + xenoprof_ovf_interrupt, + SA_INTERRUPT, + "xenoprof", + NULL); + + if (result < 0) { + unbind_virq(); + return result; + } + + ovf_irq[i] = result; } + + return 0; }